package ar.uba.tleng.g99.expregs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;

/**
 * Matchea lineas de un Reader acorde con el G99Matcher provisto.
 * 
 * @author g99
 */
public final class LineMatcher {

	/**
	 * El matcher a usar.
	 */
	private final G99Matcher matcher;

	/**
	 * El listener para disparar eventos de match o no-match.
	 */
	private final LineMatcherListener listener;

	/**
	 * Crea un nuevo LineMatcher que usara el matcher dado, y disparara los
	 * eventos en el listener.
	 * 
	 * @param matcher
	 *            el matcher a usar.
	 * @param listener
	 *            el listener para disparar eventos.
	 */
	public LineMatcher(G99Matcher matcher, LineMatcherListener listener) {
		this.matcher = matcher;
		this.listener = listener;
	}

	/**
	 * Recorre todas las lineas del Reader de entrada, y por cada una llama a
	 * {@link LineMatcherListener#onMatch(int, String)} o
	 * {@link LineMatcherListener#onNotMatch(int, String)} segun si matchea o no
	 * respectivamente.
	 * 
	 * @param reader
	 *            el reader de entrada.
	 * @throws IOException
	 */
	public void match(Reader reader) throws IOException {
		BufferedReader br = new BufferedReader(reader);
		String strLine;
		int i = 0;
		while ((strLine = br.readLine()) != null) {
			i++;
			if (this.matcher.match(strLine)) {
				this.listener.onMatch(i, strLine);
			} else {
				this.listener.onNotMatch(i, strLine);
			}
		}
	}

}
